 ##############################################
Shell 脚本基础（自动化运维必须掌握的语言）
  脚本/程序：一个可执行文本文件，可以带来某种功能
计算机语言
 规Shell脚本的一般组成
#！环境声明
#十行以内的脚本可以不写注释。十行以上的脚本必须写注释

 #############################################
案例1：书写脚本输出Hello World
 #############################################
管道
重定向输出（也支持追加重定向>>）
  >:正确信息重定向，只收集前面命令的正确输出结果 (cat /opt/1.txt)
 2>:错误信息重定向，只收集前面命令的错误输出结果（cat /etc)
 &>:正确与错误信息重定向
 {}：区分开变量与常量
例子：
[root@server0 ~]# echo 123 > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt /etc/ > /mnt/a.txt   把错误信息显示到终端  
cat: /etc/: 是一个目录
[root@server0 ~]# cat /opt/1.txt /etc/ 2> /mnt/a.txt  把错误信息显示到终端
123
[root@server0 ~]# cat /opt/1.txt /etc/ &> /mnt/a.txt
[root@server0 ~]# cat /mnt/a.txt
123
ca

 #############################################
单引号‘ ’ ：取消所有特殊字符的含义
-echo  *  会输出当前的所有内容
-echo  ‘*’ 会输出符号*

$[]：运算   echo $[9+8] 
余数一定小于除数、

$()与反撇号` `：将命令的输出结果，作为参数 参与命令的运行
-date +%F  只显示年月日 2018-07-12
[root@server0 ~]# mkdir /opt/stu-`date +%F`
[root@server0 ~]# ls /opt/
1.txt  rh  stu-2018-07-10  sysfino.sh  uu.txt




 ##############################################
案例二：
创建用户的脚本
黑洞设备：/dev/null
 
 ##############################################
变量：容器，储存的值在变化，以不变的名称，存放可以变化的值
为了增加脚本的灵活度，环境的多变性，方便重复使用一个值

变量的特征：
- A=1000  (等号两端不能有空格）
-echo A  输出A
-echo $A 输出 1000

 ##############################################
定义变量
-等号两边不要有空格
-不能有特殊符号，不要使用关键字
-变量名只能由字母/数字/下划线组成
-数字不允许作为开头
-最好顾名思义，一看就明白

 ##############################################
环境变量  
都是大写的，由系统直接定义并且赋值完成，用户直接调用 
-USER当前登录的用户名
-RANDOM 永远存放一个随机数（0-32767）

位置变量
都是数字，由系统定义并且赋值完成，用户直接调用
执行脚本是提供命令行参数
-表示为$n,n为序号
-$1作为命令参数，顺序
-$2
-$3
预定义变量
都是特殊符号，由系统定义并且赋值完成，用户直接调用
-$#：统计已加载的位置变量的个数
-$*：所有位置变量的值
-$?：程序退出后的状态值，0表示正常，其他值异常

自定义变量

案例： 产生一个有范围的随机数字，取余数运算，余数一定小于除数

 ##############################################
条件测试及选择
常用的测试选项
检查文件状态
   -e:文档存在为真
   -d:文档存在，且必须为目录为真
   - f:文档存在，且必须为文件为真
   -z：变量是否为空
比较整数大小
   -gt：大于
   -ge：大于等于
   -eq：等于
   -ne：不等于
   -lt：小于
   -le：小于等于
   
   -g=大  -l=小  t=于 e=等 n=不

字符串比对
   ==：一致为真
   ！=：不一致为真

补充：Sleep 0.5 延时0.5秒
 ##############################################
If双分支处理
 案例3：判断用户通过命令行给出参数，参数为ip地址
         书写一个脚本，判断本机是否可以与用户输入的ip地址进行通信
         如果能通信，则输出可以通信，否则输出不能通信

 提升用户体验
   产生交互，与用户进行问答，将用户再键盘上输入的答案，作为参数
 -read ：产生交互
         -p  ‘屏幕输出信息’ 
 ##############################################
案例4：书写猜数脚本

#!/bin/bash
read -p '请输入0-9任一整数' a
rnum=$[RANDOM%10]
m=$[RANDOM%3]
if [ $m -eq 0 ]; then
n=元
elif [ $m -eq 1 ]; then
n=泰铢
else
n=越南盾
fi

if [ $a -eq $rnum ]; then
echo 恭喜猜中了，奖金为10000$n
else
echo 谢谢回顾，中奖号码为$rnum
fi

[root@server0 ~]# /opt/ng.sh
请输入0-9任一整数3
恭喜猜中了，奖金为10000泰铢
[root@server0 ~]# /opt/ng.sh
请输入0-9任一整数3
谢谢回顾，中奖号码为4
[root@server0 ~]# /opt/ng.sh
请输入0-9任一整数3
谢谢回顾，中奖号码为4
[root@server0 ~]# /opt/ng.sh
请输入0-9任一整数3
恭喜猜中了，奖金为10000越南盾

案例6：

应用层：网络服务与客户机交互的窗口
传输层：定义了数据通信的端口及协议，差错校验
网络层：建立逻辑地址连接，选择数据通信最佳路径
数据链路层：建立逻辑连接，建立硬件地址连接，差错校验
物理层：建立、维护、断开物理连接
